package com.blog.cmrpersonalblog.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.blog.cmrpersonalblog.dto.article.request.ArticleTagCreateRequest;
import com.blog.cmrpersonalblog.dto.article.request.ArticleTagQueryRequest;
import com.blog.cmrpersonalblog.dto.article.request.ArticleTagUpdateRequest;
import com.blog.cmrpersonalblog.dto.article.response.ArticleTagResponse;
import com.blog.cmrpersonalblog.dto.tag.requset.TagBatchOperationRequest;
import com.blog.cmrpersonalblog.dto.tag.requset.TagCreateRequest;
import com.blog.cmrpersonalblog.dto.tag.requset.TagQueryRequest;
import com.blog.cmrpersonalblog.dto.tag.requset.TagUpdateRequest;
import com.blog.cmrpersonalblog.dto.tag.respnose.TagManagementResponse;
import com.blog.cmrpersonalblog.entity.ArticleTag;

import java.util.List;
import java.util.Map;

/**
 * 标签管理服务接口
 */
public interface TagManagementService {

    /**
     * 分页查询标签列表
     * @param queryRequest 查询条件
     * @return 分页结果
     */
    IPage<TagManagementResponse> getTagList(TagQueryRequest queryRequest);

    /**
     * 获取标签详情
     * @param tagId 标签ID
     * @return 标签详情
     */
    TagManagementResponse getTagDetail(Long tagId);

    /**
     * 创建标签
     * @param createRequest 创建请求
     * @param operatorId 操作人ID
     * @return 创建结果
     */
    boolean createTag(TagCreateRequest createRequest, Long operatorId);

    /**
     * 更新标签
     * @param updateRequest 更新请求
     * @param operatorId 操作人ID
     * @return 更新结果
     */
    boolean updateTag(TagUpdateRequest updateRequest, Long operatorId);

    /**
     * 删除标签
     * @param tagId 标签ID
     * @param operatorId 操作人ID
     * @return 删除结果
     */
    boolean deleteTag(Long tagId, Long operatorId);

    /**
     * 批量操作标签
     * @param batchRequest 批量操作请求
     * @param operatorId 操作人ID
     * @return 操作结果
     */
    Map<String, Object> batchOperateTags(TagBatchOperationRequest batchRequest, Long operatorId);

    /**
     * 启用标签
     * @param tagId 标签ID
     * @param operatorId 操作人ID
     * @return 操作结果
     */
    boolean enableTag(Long tagId, Long operatorId);

    /**
     * 禁用标签
     * @param tagId 标签ID
     * @param operatorId 操作人ID
     * @return 操作结果
     */
    boolean disableTag(Long tagId, Long operatorId);

    /**
     * 更新标签颜色
     * @param tagId 标签ID
     * @param color 新颜色
     * @param operatorId 操作人ID
     * @return 操作结果
     */
    boolean updateTagColor(Long tagId, String color, Long operatorId);

    /**
     * 重置标签使用次数
     * @param tagId 标签ID
     * @param operatorId 操作人ID
     * @return 操作结果
     */
    boolean resetTagUseCount(Long tagId, Long operatorId);

    /**
     * 获取启用的标签列表（用于下拉选择）
     * @return 启用的标签列表
     */
    List<ArticleTag> getEnabledTags();

    /**
     * 获取热门标签列表
     * @param limit 限制数量
     * @return 热门标签列表
     */
    List<ArticleTag> getPopularTags(Integer limit);

    /**
     * 获取最近创建的标签
     * @param limit 限制数量
     * @return 最近创建的标签列表
     */
    List<ArticleTag> getRecentTags(Integer limit);

    /**
     * 检查标签名称是否已存在
     * @param name 标签名称
     * @param excludeId 排除的标签ID（用于更新时检查）
     * @return 是否存在
     */
    boolean existsTagName(String name, Long excludeId);

    /**
     * 检查标签是否被文章使用
     * @param tagId 标签ID
     * @return 是否被使用
     */
    boolean isTagUsedByArticles(Long tagId);

    /**
     * 获取标签统计信息
     * @return 统计信息
     */
    Map<String, Object> getTagStatistics();

    /**
     * 获取标签状态分布
     * @return 状态分布
     */
    List<Map<String, Object>> getTagStatusDistribution();

    /**
     * 获取标签使用频率分布
     * @return 使用频率分布
     */
    List<Map<String, Object>> getTagUsageDistribution();

    /**
     * 获取标签颜色分布统计
     * @return 颜色分布统计
     */
    List<Map<String, Object>> getTagColorDistribution();

    /**
     * 搜索标签（用于自动完成）
     * @param keyword 关键词
     * @param limit 限制数量
     * @return 标签列表
     */
    List<ArticleTag> searchTags(String keyword, Integer limit);

    /**
     * 获取相似标签
     * @param tagName 标签名称
     * @param limit 限制数量
     * @return 相似标签列表
     */
    List<ArticleTag> getSimilarTags(String tagName, Integer limit);

    /**
     * 合并标签
     * @param sourceTagIds 源标签ID列表
     * @param targetTagId 目标标签ID
     * @param operatorId 操作人ID
     * @return 操作结果
     */
    boolean mergeTags(List<Long> sourceTagIds, Long targetTagId, Long operatorId);

    /**
     * 获取未使用的标签列表
     * @return 未使用的标签列表
     */
    List<ArticleTag> getUnusedTags();

    /**
     * 清理未使用的标签
     * @param daysBefore 多少天前创建且未使用的标签
     * @param operatorId 操作人ID
     * @return 清理数量
     */
    int cleanupUnusedTags(Integer daysBefore, Long operatorId);

    /**
     * 获取标签趋势统计
     * @param months 统计月数
     * @return 趋势统计
     */
    List<Map<String, Object>> getTagTrendStatistics(Integer months);

    /**
     * 增加标签使用次数
     * @param tagId 标签ID
     * @return 操作结果
     */
    boolean incrementTagUseCount(Long tagId);

    /**
     * 减少标签使用次数
     * @param tagId 标签ID
     * @return 操作结果
     */
    boolean decrementTagUseCount(Long tagId);

    /**
     * 同步标签使用次数（重新计算所有标签的使用次数）
     * @param operatorId 操作人ID
     * @return 同步结果
     */
    Map<String, Object> syncTagUseCounts(Long operatorId);

    /**
     * 获取标签的文章数量
     * @param tagId 标签ID
     * @return 文章数量
     */
    Long getTagArticleCount(Long tagId);

    /**
     * 获取标签的已发布文章数量
     * @param tagId 标签ID
     * @return 已发布文章数量
     */
    Long getTagPublishedArticleCount(Long tagId);

    // ==================== 新增接口方法 ====================

    /**
     * 分页查询标签列表（新）
     * @param queryRequest 查询条件
     * @return 分页结果
     */
    IPage<ArticleTagResponse> getTagPage(ArticleTagQueryRequest queryRequest);

    /**
     * 获取标签详情（新）
     * @param tagId 标签ID
     * @return 标签详情
     */
    ArticleTagResponse getTagDetailNew(Long tagId);

    /**
     * 创建标签（新）
     * @param createRequest 创建请求
     * @return 创建结果
     */
    boolean createTag(ArticleTagCreateRequest createRequest);

    /**
     * 更新标签（新）
     * @param updateRequest 更新请求
     * @return 更新结果
     */
    boolean updateTag(ArticleTagUpdateRequest updateRequest);

    /**
     * 删除标签（新）
     * @param tagId 标签ID
     * @return 删除结果
     */
    boolean deleteTag(Long tagId);

    /**
     * 批量操作标签（新）
     * @param batchRequest 批量操作请求
     * @return 操作结果
     */
    String batchOperation(TagBatchOperationRequest batchRequest);

    /**
     * 检查标签名称是否存在（新）
     * @param name 标签名称
     * @param excludeId 排除的标签ID
     * @return 是否存在
     */
    boolean isTagNameExists(String name, Long excludeId);

    /**
     * 获取所有标签列表（用于用户端文章发布）
     * @return 所有标签列表
     */
    List<ArticleTag> getAllTags();
}
